﻿-------------------------------------------------------------------------------
-- Работа с файлами через TeraCopy (TeraCopy.exe © http://www.codesector.com). © SimSU
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Plugin_TeraCopy.cfg
return{
  KeyCopy="CtrlShiftF5"; --PriorCopy=50; --Копирование в фоне.
  KeyMove="CtrlShiftF6"; --PriorMove=50; --Перенос в фоне.
  KeyDelete="CtrlShiftF8"; --PriorDelete=50; --Удаление в фоне.

  TeraName=win.GetEnv("FARHOME").."\\TeraCopy.exe"; -- Путь до Plugin_TeraCopy.exe
  Timeout=500; -- Время ожидания пока Plugin_TeraCopy обработает файл...
}
-- Конец файла Profile\SimSU\Plugin_TeraCopy.cfg
end

_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\Plugin_TeraCopyRussian.lng
return{
  CopyDescr="Копирование в фоне с помощью TeraCopy.exe. © SimSU";
  MoveDescr="Перенос в фоне с помощью TeraCopy.exe. © SimSU";
  DeleteDescr="Удаление в фоне с помощью TeraCopy.exe. © SimSU";
}
-- Конец файла Profile\SimSU\Plugin_TeraCopyRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Plugin_TeraCopyEnglish.lng
return{
  CopyDescr="Копирование в фоне с помощью TeraCopy.exe. © SimSU";
  MoveDescr="Перенос в фоне с помощью TeraCopy.exe. © SimSU";
  DeleteDescr="Удаление в фоне с помощью TeraCopy.exe. © SimSU";
}
-- End of file Profile\SimSU\Plugin_TeraCopyEnglish.lng
end end

local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Plugin_TeraCopy"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Plugin_TeraCopy.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Plugin_TeraCopy.cfg") or Settings)()

local SimSU=SimSU or {}
SimSU.Plugin_TeraCopy={}
-------------------------------------------------------------------------------
local TeraName=S.TeraName or "TeraCopy.exe"
if not win.GetFileAttr(S.TeraName) then return end
local Timeout=S.Timeout or 1000

function SimSU.Plugin_TeraCopy.FileList() --Формирование списка файлов с полными путями.
  local FileName
  FileName=far.MkTemp() --Запрашиваем имя временного файла.
  local File=io.open(FileName,"w+b") -- Открываем временный файл в режиме записи.
  local list,idx={},{}
  for i=1,panel.GetPanelInfo(nil,1).SelectedItemsNumber do
    list[i]=panel.GetSelectedPanelItem(nil,1,i).FileName
    idx[i]=i
  end
  panel.ClearSelection(nil,1,idx); panel.RedrawPanel(nil,1) -- Очищаем выделение файлов.
  local Path=panel.GetPanelDirectory(nil,1).Name
  list=Path.."\\"..table.concat(list,"\n"..Path.."\\")
  File:write(string.char(239,187,191),list) -- Записываем BOM и список в файл.
  File:close() --Закрываем файл.
  return FileName
end

function SimSU.Plugin_TeraCopy.Copy() --Копирование в фоне.
  local FileName=SimSU.Plugin_TeraCopy.FileList() -- Формируем список файлов в файле.
  win.ShellExecute(nil,nil,TeraName,'copy *"'..FileName..'" "'..panel.GetPanelDirectory(nil,0).Name..'"',nil,nil)
  win.Sleep(Timeout); win.DeleteFile(FileName) -- Удаляем наш временный фай.
end

function SimSU.Plugin_TeraCopy.Move() --Перенос в фоне.
  local FileName=SimSU.Plugin_TeraCopy.FileList() -- Формируем список файлов в файле.
  win.ShellExecute(nil,nil,TeraName,'move *"'..FileName..'" "'..panel.GetPanelDirectory(nil,0).Name..'"',nil,nil)
  win.Sleep(Timeout); win.DeleteFile(FileName) -- Удаляем наш временный фай.
end

function SimSU.Plugin_TeraCopy.Delete() --Удаление в фоне.
  local FileName=SimSU.Plugin_TeraCopy.FileList() -- Формируем список файлов в файле.
  win.ShellExecute(nil,nil,TeraName,'delete *"'..FileName..'"',nil,nil)
  win.Sleep(Timeout); win.DeleteFile(FileName) -- Удаляем наш временный фай.
end
-------------------------------------------------------------------------------
if not Macro then return {Plugin_TeraCopy=SimSU.Plugin_TeraCopy} end

local ok, mod = pcall(require,"SimSU.Plugin_TeraCopy"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------

Macro {area="Shell"; key=S.KeyCopy; priority=S.PriorCopy; description=M.CopyDescr; flags="NoPluginPanels NoPluginPPanels";
--  condition=function() return win.GetFileAttr(TeraName) end;
  action=SimSU.Plugin_TeraCopy.Copy;
}
Macro {area="Shell"; key=S.KeyMove; priority=S.PriorMove; description=M.MoveDescr; flags="NoPluginPanels NoPluginPPanels";
--  condition=function() return win.GetFileAttr(TeraName) end;
  action=SimSU.Plugin_TeraCopy.Move;
}
Macro {area="Shell"; key=S.KeyDelete; priority=S.PriorDelete; description=M.DeleteDescr; flags="NoPluginPanels";
--  condition=function() return win.GetFileAttr(TeraName) end;
  action=SimSU.Plugin_TeraCopy.Delete;
}
